一個類別不應該被強迫實作一個它不需要的方法
意思就是說,一個類別不應該去實作它不需要去執行的方法。感覺有點廢話,又把引言說了一次,直接來看看例子感受一下吧
本次例子以Typescript為範例,Typescript更能凸顯出介面隔離原則的重要性。
假設有一個車子的介面,必須實作以下這些方法:
interface Car {
startEngine(): void;
colseEngine(): void;
greeting(): void;
enableDebugMode(): void;
}
分別有兩個對象去實作車子的介面:駕駛和工程師
class driver implements Car {
startEngine() {
console.log("啟動車子");
}
colseEngine() {
console.log("關閉車子");
}
greeting() {
console.log("歡迎搭車");
}
enableDebugMode() {
console.log('錯誤,無權存取')
}
}
class engineer implements Car {
startEngine() {
console.log("啟動車子");
}
colseEngine() {
console.log("關閉車子");
}
greeting() {
console.log("歡迎搭車");
}
enableDebugMode() {
console.log("啟動工程模式");
}
}
實際執行的結果
const driver1 = new driver();
const engineer1 = new engineer();
console.log(driver1.enableDebugMode()); // 錯誤,無權存取
console.log(engineer1.enableDebugMode()); // 啟動工程模式
從這個例子可以看出, enableDebugMode
這個功能本來只專屬工程人員使用,不開放給一般駕駛使用。但是因為Car的介面有這個,所以駕駛不得不實作這個功能,然後丟出錯誤。
實作了之後再拋出錯誤,實在一個很彆扭的行為。會這麼彆扭的原因就是介面 Car
所要實作的方法,並不是通用,大家都得實作的方法。導致實作他的對象被迫以奇怪的方式實作。
因此如果要遵守介面隔離原則的話,可以將介面抽離,讓不同需要的人分別實作
interface Car {
startEngine(): void;
colseEngine(): void;
greeting(): void;
}
interface DebugMode{
enableDebugMode(): void;
}
如此一來,駕駛和工程人員就可以分別去實作不同的東西
class driver implements Car {
startEngine() {
console.log("啟動車子");
}
colseEngine() {
console.log("關閉車子");
}
greeting() {
console.log("歡迎搭車");
}
}
class engineer implements Car,DebugMode {
startEngine() {
console.log("啟動車子");
}
colseEngine() {
console.log("關閉車子");
}
greeting() {
console.log("歡迎搭車");
}
enableDebugMode() {
console.log("啟動工程模式");
}
}
將介面隔離出來的優點是可以不用被迫去實作不需要用到的方法。如果看到一堆強迫被執行的功能又要以奇怪的方式繞過,在維護上可以說是極難維護。而且如果沒有留下註解之類的話,還要自行花費大量時間抽絲剝繭。那倒不如一開始就將介面隔離,使用好的介面、擁有好的架構。